Turn the private #define for the group-shifting modifier into API
authorMichael Natterer <mitch@lanedo.com>
Fri, 18 Nov 2011 14:14:31 +0000 (15:14 +0100)
committerMichael Natterer <mitch@gimp.org>
Fri, 18 Nov 2011 14:14:31 +0000 (15:14 +0100)
Add GDK_MODIFIER_INTENT_SHIFT_GROUP to enum GdkModifierIntent
and handle it in gdk_keymap_get_modifier_mask(). Add an X11
impl of the method and return keymap_x11->group_switch_mask.
Return 0 from the default impl because we don't know.

gdk/gdkkeys.c
gdk/gdktypes.h
gdk/quartz/gdkkeys-quartz.c
gdk/x11/gdkkeys-x11.c
gtk/gtkkeyhash.c
gtk/gtkprivate.c
gtk/gtkprivate.h

index a12d68d4936db1bd002d30d1090dc336ddeef3e5..bd3f7dd7a906fbe7a7962b81bd626b01dcdf623d 100644 (file)
@@ -634,6 +634,9 @@ gdk_keymap_real_get_modifier_mask (GdkKeymap         *keymap,
     case GDK_MODIFIER_INTENT_NO_TEXT_INPUT:
       return GDK_MOD1_MASK | GDK_CONTROL_MASK;
 
+    case GDK_MODIFIER_INTENT_SHIFT_GROUP:
+      return 0;
+
     default:
       g_return_val_if_reached (0);
     }
index a0ea89368d497434e58183a9b59fbad18fb354aa..577ab96bd70393332970939f4a9673461f09698f 100644 (file)
@@ -257,6 +257,8 @@ typedef enum
  * @GDK_MODIFIER_INTENT_NO_TEXT_INPUT: when any of these modifiers is pressed, the
  *  key event cannot produce a symbol directly. This is meant to be used for
  *  input methods, and for use cases like typeahead search.
+ * @GDK_MODIFIER_INTENT_SHIFT_GROUP: the modifier that switches between keyboard
+ *  groups (AltGr on X11/Windows and Option/Alt on OS X).
  *
  * This enum is used with gdk_keymap_get_modifier_mask() and
  * gdk_get_modifier_mask() in order to determine what modifiers the
@@ -274,7 +276,8 @@ typedef enum
   GDK_MODIFIER_INTENT_CONTEXT_MENU,
   GDK_MODIFIER_INTENT_EXTEND_SELECTION,
   GDK_MODIFIER_INTENT_MODIFY_SELECTION,
-  GDK_MODIFIER_INTENT_NO_TEXT_INPUT
+  GDK_MODIFIER_INTENT_NO_TEXT_INPUT,
+  GDK_MODIFIER_INTENT_SHIFT_GROUP
 } GdkModifierIntent;
 
 typedef enum
index 07d8489740fab0be19a352e5e4162ecd4deea79c..1156591abf7f67f0a93b6e8ec611a55ee71fd5a2 100644 (file)
@@ -757,6 +757,9 @@ gdk_quartz_keymap_get_modifier_mask (GdkKeymap         *keymap,
     case GDK_MODIFIER_INTENT_NO_TEXT_INPUT:
       return GDK_MOD2_MASK | GDK_CONTROL_MASK;
 
+    case GDK_MODIFIER_INTENT_SHIFT_GROUP:
+      return GDK_MOD1_MASK;
+
     default:
       g_return_val_if_reached (0);
     }
index 80bf7113e6031ffe48e4db8111bb05fc723b2908..ec5d0ec89a80d7c227bb0de7c5c81f2863f9b1b0 100644 (file)
@@ -1609,6 +1609,23 @@ gdk_x11_keymap_map_virtual_modifiers (GdkKeymap       *keymap,
   return retval;
 }
 
+static GdkModifierType
+gdk_x11_keymap_get_modifier_mask (GdkKeymap         *keymap,
+                                  GdkModifierIntent  intent)
+{
+  GdkX11Keymap *keymap_x11 = GDK_X11_KEYMAP (keymap);
+
+  switch (intent)
+    {
+    case GDK_MODIFIER_INTENT_SHIFT_GROUP:
+      return keymap_x11->group_switch_mask;
+
+    default:
+      GDK_KEYMAP_CLASS (gdk_x11_keymap_parent_class)->get_modifier_mask (keymap,
+                                                                         intent);
+    }
+}
+
 static void
 gdk_x11_keymap_class_init (GdkX11KeymapClass *klass)
 {
@@ -1627,4 +1644,5 @@ gdk_x11_keymap_class_init (GdkX11KeymapClass *klass)
   keymap_class->translate_keyboard_state = gdk_x11_keymap_translate_keyboard_state;
   keymap_class->add_virtual_modifiers = gdk_x11_keymap_add_virtual_modifiers;
   keymap_class->map_virtual_modifiers = gdk_x11_keymap_map_virtual_modifiers;
+  keymap_class->get_modifier_mask = gdk_x11_keymap_get_modifier_mask;
 }
index 954b9a100353bbc56c7573dd8369699174565da9..fd2673909171d2deb3625ae3954c7541a248fce0 100644 (file)
@@ -395,6 +395,7 @@ _gtk_key_hash_lookup (GtkKeyHash      *key_hash,
   gint level;
   GdkModifierType modifiers;
   GdkModifierType consumed_modifiers;
+  GdkModifierType shift_group_mask;
   gboolean group_mod_is_accel_mod = FALSE;
   const GdkModifierType xmods = GDK_MOD2_MASK|GDK_MOD3_MASK|GDK_MOD4_MASK|GDK_MOD5_MASK;
   const GdkModifierType vmods = GDK_SUPER_MASK|GDK_HYPER_MASK|GDK_META_MASK;
@@ -411,7 +412,9 @@ _gtk_key_hash_lookup (GtkKeyHash      *key_hash,
   /* if the group-toggling modifier is part of the default accel mod
    * mask, and it is active, disable it for matching
    */
-  if (mask & GTK_TOGGLE_GROUP_MOD_MASK)
+  shift_group_mask = gdk_keymap_get_modifier_mask (key_hash->keymap,
+                                                   GDK_MODIFIER_INTENT_SHIFT_GROUP);
+  if (mask & shift_group_mask)
     group_mod_is_accel_mod = TRUE;
 
   gdk_keymap_map_virtual_modifiers (key_hash->keymap, &mask);
@@ -449,8 +452,7 @@ _gtk_key_hash_lookup (GtkKeyHash      *key_hash,
                    * otherwise we can get multiple exact matches, some being
                    * bogus */
                   (!group_mod_is_accel_mod ||
-                   (state & GTK_TOGGLE_GROUP_MOD_MASK) ==
-                   (entry->modifiers & GTK_TOGGLE_GROUP_MOD_MASK)))
+                   (state & shift_group_mask) == (entry->modifiers & shift_group_mask)))
 
                {
                  GTK_NOTE (KEYBINDINGS,
index 1ec08147fb00d38c8ee843be7490029f5838b5bc..ed5f1f7a70d84a9a8f42359612d72b684d1a3699 100644 (file)
@@ -216,15 +216,18 @@ _gtk_translate_keyboard_accel_state (GdkKeymap       *keymap,
                                      gint            *level,
                                      GdkModifierType *consumed_modifiers)
 {
+  GdkModifierType shift_group_mask;
   gboolean group_mask_disabled = FALSE;
   gboolean retval;
 
   /* if the group-toggling modifier is part of the accel mod mask, and
    * it is active, disable it for matching
    */
-  if (accel_mask & state & GTK_TOGGLE_GROUP_MOD_MASK)
+  shift_group_mask = gdk_keymap_get_modifier_mask (keymap,
+                                                   GDK_MODIFIER_INTENT_SHIFT_GROUP);
+  if (accel_mask & state & shift_group_mask)
     {
-      state &= ~GTK_TOGGLE_GROUP_MOD_MASK;
+      state &= ~shift_group_mask;
       group = 0;
       group_mask_disabled = TRUE;
     }
@@ -244,7 +247,7 @@ _gtk_translate_keyboard_accel_state (GdkKeymap       *keymap,
         *effective_group = 1;
 
       if (consumed_modifiers)
-        *consumed_modifiers &= ~GTK_TOGGLE_GROUP_MOD_MASK;
+        *consumed_modifiers &= ~shift_group_mask;
     }
 
   return retval;
index e243199bc34efac8be8b25489172be7e7d5d6f98..ba18f043ceaeeae9aa183b5c04a4af31e82b5a2e 100644 (file)
@@ -62,13 +62,6 @@ GdkModifierType _gtk_replace_virtual_modifiers (GdkKeymap       *keymap,
                                                 GdkModifierType  modifiers);
 GdkModifierType _gtk_get_primary_accel_mod     (void);
 
-/* temp hack, will go away soon --mitch */
-#ifndef GDK_WINDOWING_QUARTZ
-#define GTK_TOGGLE_GROUP_MOD_MASK 0
-#else
-#define GTK_TOGGLE_GROUP_MOD_MASK GDK_MOD1_MASK
-#endif
-
 gboolean _gtk_translate_keyboard_accel_state   (GdkKeymap       *keymap,
                                                 guint            hardware_keycode,
                                                 GdkModifierType  state,